package edu.mju.Reflect;

import java.lang.reflect.Method;

public class TestPersonService1 {

	public static void main(String[] args) {
		TestPersonService1 testPersonService1 = new TestPersonService1();
		PersonServiceImpl p1 = testPersonService1.getInstance();
		System.out.println(p1.toString());
		System.out.println("-----------------");
		//testPersonService1.reflectMethod(p1,"sayHello","传入sayHello()参数的值");
		//PersonServiceImpl p2 = (PersonServiceImpl)reflectMethod("sayHello","反射");
	}


	/**
	 *  反射生成对象
	 * @return PersonServiceImpl()
	 */
	public PersonServiceImpl getInstance() {
		//创建一个空的PersonServiceImpl对象
		PersonServiceImpl object = null;
		try {
			//Class.forName：类加载器注册PersonServiceImpl类
			//newInstance: 返回类的新分配的实例（对象）
			object = (PersonServiceImpl) Class.forName("edu.mju.Reflect.PersonServiceImpl").newInstance();
		} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
			e.printStackTrace();
		}
		return object;
	}
	

	/**
	 *  获取和反射方法
	 * @param target 反射的对象
	 * @param methodName 反射对象的方法名
	 * @param name 方法中的参数
	 * @return 反射后的对象
	 */
	public Object reflectMethod(Object target,String methodName,String name) {
		Object  object = null;
		try {
			//1. 当知道具体哪个类的时候：
			// Method method = PersonServiceImpl.class.getMethod(methodName, String.class);
			//2.当不知道具体哪个类的时候
			Method method = target.getClass().getMethod(methodName, String.class);
			//public Object invoke(Object target,具体哪个对象调用方法
			//                     Object... args)：target对象中的methodName的方法中的参数
			object = method.invoke(target, name);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return object ;
	}

}
